package com.xtck.ha.fault.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;

@Service
@Slf4j
public class DynamicTaskService {
    @Autowired
    private TaskScheduler taskScheduler;  // Spring 自动注入的调度器

    // 存储任务名称与对应的 Future 对象（用于停止任务）
    private final Map<String, ScheduledFuture<?>> taskMap = new ConcurrentHashMap<>();

    /**
     * 启动或更新定时任务
     * @param taskName 任务名称（唯一标识）
     * @param cronExpression 从数据库查询的 cron 表达式
     * @param task 任务逻辑（Runnable）
     */
    public void startOrUpdateTask(String taskName, String cronExpression, Runnable task) {
        // 1. 如果任务已存在，先取消旧任务
        if (taskMap.containsKey(taskName)) {
            taskMap.get(taskName).cancel(false);  // false 表示不中断正在执行的任务
        }
        // 2. 注册新任务
        ScheduledFuture<?> future = taskScheduler.schedule(
                task,
                new CronTrigger(cronExpression)  // 动态 cron 表达式
        );
        // 3. 保存 Future 对象
        taskMap.put(taskName, future);
        log.info("任务已启动: " + taskName + " | Cron: " + cronExpression);
    }

    /**
     * 停止任务
     * @param taskName 任务名称
     */
    public void stopTask(String taskName) {
        if (taskMap.containsKey(taskName)) {
            taskMap.get(taskName).cancel(false);
            taskMap.remove(taskName);
            log.info("任务已停止: " + taskName);
        }
    }
}
